package database

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/redis/go-redis/v9"
	"good.house/config"
	"good.house/internal/model"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

func InitDB(cfg *config.Config) *gorm.DB {
	db, err := gorm.Open(mysql.Open(cfg.MySql.DSN()), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info), // 显示所有日志
	})

	if err != nil {
		log.Fatal("无法连接到数据库", err)
	}

	sqlDB, err := db.DB()

	if err != nil {
		log.Fatal("无法获取数据库连接池", err)
	}

	fmt.Printf("当前环境%s，数据库连接成功\n", cfg.Env)

	// 设置数据库连接池
	sqlDB.SetMaxIdleConns(cfg.MySql.MaxIdleConns)
	// 设置数据库最大连接数
	sqlDB.SetMaxOpenConns(cfg.MySql.MaxOpenConns)
	// 设置数据库连接最大生命周期
	sqlDB.SetConnMaxLifetime(time.Duration(cfg.MySql.ConnMaxLifetime) * time.Second)

	// 自动迁移数据库表
	autoMigrateErr := db.AutoMigrate(&model.User{}, &model.Publish{}, &model.ResourceData{})

	if autoMigrateErr != nil {
		log.Fatal("自动迁移失败", autoMigrateErr.Error())
	}

	return db
}

func InitRedis(cfg *config.Config) *redis.Client {
	rdb := redis.NewClient(&redis.Options{
		Addr:     fmt.Sprintf("%s:%d", cfg.Redis.Host, cfg.Redis.Port),
		Password: cfg.Redis.Password,  // 没有密码则留空
		DB:       cfg.Redis.DefaultDb, // 默认DB
	})

	ctx := context.Background()
	if err := rdb.Ping(ctx).Err(); err != nil {
		log.Fatal("redis连接失败")
	}

	fmt.Printf("当前环境%s，redis连接成功\n", cfg.Env)

	return rdb
}
